home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-08-18 | 2.8 KB | 106 lines | [TEXT/Moml] |
- (* AppleScript.sml *)
- (* 1997 Jul 04 e *)
-
- (* This module is a Mac specific implementation of an applescript client
- it provides the capability to
- - compile AppleScript source
- - run the resulting script objects
- - retrieve string results and/or error messages
- - dispose of script objects and results
- *)
-
- (* references:
- Inside Macintosh: Interapplication Communication, especially Chapter 10
- AppleScript Language Guide English Edition
- -- available at http://applescript.apple.com/support.html
- *)
-
- (* OSA is Apple's Open Scripting Architecture -- the interface to AppleScript *)
-
- type OSAerr = int (* 0 => OK *)
- prim_type OSAID_ (* handle to compiled script objects and results *)
- type OSAID = { id: OSAID_, ok: bool ref }
-
- exception AppleScriptErr of OSAerr * string;
-
- local
-
- type OSA_oid = { err : OSAerr, id : OSAID_ }
- type OSA_str = { err : OSAerr, str : string }
-
- prim_val as_compile_ : string -> OSA_oid = 1 "mac_OSACompile"
- prim_val as_execute_ : OSAID_ -> OSA_oid = 1 "mac_OSAExecute"
- prim_val as_display_ : OSAID_ -> OSA_str = 1 "mac_OSADisplay"
- prim_val as_dispose_ : OSAID_ -> OSAerr = 1 "mac_OSADispose"
- prim_val as_error_ : unit -> OSA_str = 1 "mac_OSAScriptError"
-
- fun as_run_script_ xid =
- let
- val { err, id = rid } = as_execute_ xid
- val res = if err = 0
- then as_display_ rid
- else as_error_ ()
- in
- as_dispose_ rid;
- res
- end
-
- fun as_run_text_ text =
- let
- val (ss as { err, id = xid }) = as_compile_ text
- in
- let val res = if err = 0
- then as_run_script_ xid
- else as_error_ ()
- in
- as_dispose_ xid;
- res
- end
- end
-
- fun as_check_str_ { err, str } =
- if err = 0
- then str
- else raise (AppleScriptErr (err,str))
-
- fun as_raise_err _ =
- let val {err,str} = as_error_ ()
- in raise (AppleScriptErr (err,str)) end
-
- fun as_check_err_ err { id, ok } =
- if err = 0
- then ok := false
- else as_raise_err ()
-
- fun as_check_oid_ { err = ror, id = rid } =
- if ror = 0
- then { id = rid, ok = ref true }
- else as_raise_err ()
-
- fun as_check_osaid_ { id = xid, ok } =
- if !ok
- then xid
- else raise (AppleScriptErr (~1,"Attempt to use disposed OSAID"))
-
- in
-
- (* as_compile -- compiles a text script for later execution *)
-
- fun as_compile txt = as_check_oid_ (as_compile_ txt);
-
- (* as_dispose -- disposes the compiled script freeing AS memory *)
-
- fun as_dispose s = as_check_err_ (as_dispose_ (as_check_osaid_ s)) s;
-
- (* as_run_script -- runs a precompiled script *)
-
- fun as_run_script s = as_check_str_ (as_run_script_ (as_check_osaid_ s));
-
- (* as_run_text -- runs a one shot script, like system() but with a result *)
-
- fun as_run_text txt = as_check_str_ (as_run_text_ txt)
-
- end;
-
- (* end of AppleScript.sml *)
-